//负责axios的配置 导出配置好的axios 
// 提取axios  
import axios from 'axios'
// 然后进行配置
//1、基准地址配置 全局基准地址
axios.defaults.baseURL="http://ttapi.research.itcast.cn/mp/v1_0/"
//请求头配置 需要加上token 请求头token在本地存储中
import auth from '@/utils/auth'
import router from '../router'
// 导入json第三方包处理超出范围的数值
import JSONbig from 'json-bigint'
// 修改json转换方式 解决数字超16位无法确定精度问题
//data理想情况下是json数据，但是删除的时候没响应data===null 所以需要处理
axios.defaults.transformResponse=[data=>{
  try{
    return JSONbig.parse(data)
  }catch(e){
    return data
  }
}]
// 单页面因为没有跳转刷新问题 所以当前代码只会在初始化的时候执行一次所以 无法实施拿到数据
// 我们要做的是让每次跳转请求都会执行一次 获取本地token追加到头部
// 需要请求拦截器
// axios.defaults.headers.Authorization=`Bearer ${auth.getUser().token}`
// 添加请求拦截器（每次请求前做的事情）
axios.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    // 当前函数在每次请求前都会执行
    // config是我们的请求配置 相当于axios.defaults.
    // 可以修改config请求配置
    // 这里axios需要返回的config
    config.headers.Authorization=`Bearer ${auth.getUser().token}`
    return config;
    // 又有了问题    如果token无效了该怎么办
  }, function (error) {
    // 对请求错误做些什么
    // 当上面的函数处理逻辑出现异常就会执行第二个函数
    // 调接口出现问题
    // error错误对象 这里axios要求需要返回一个错误状态的promise对象 reject代表失败的意思
    // 补充:创建promise的三种方式  reject和resolve一旦执行就结束
    return Promise.reject(error);
  });
//   如果token无效了该怎么办 响应后 报错401跳转到响应页面
// 添加响应拦截器
axios.interceptors.response.use(function (response) {
    // 当响应成功的时候执行
    // 对响应数据做点什么 response形参和res是同一对象 response.data 后台给的数据 
    // 可以对后台响应的数据做数据类型修改
    return response;
  }, function (error) {
    // 对响应错误做点什么
    // 当响应失败的时候会执行
    // 上面的函数处理逻辑出现异常也会执行
    // 默认返回错误的promise
    // 判断响应状态码是401 清除本地用户信息 跳转到登录页面
    console.dir(error)
    if(error.response && error.response.status===401){
        auth.delUser()
        // 跳转到登录页面 编程式导航 this.$router.push('/login') 因为this不是vue实例所以不能用
        // $router其实就是我们自己初始化的router实例 src/router/index.js导出
        //3此模块导入路由实例 使用路由实例调用push方法
        // alert('请重新登录')
        router.push('/login')
    }
    return Promise.reject(error);
  });

export default axios